package com.cskaoyan.java.object._6clone.cloneable;

/**
 * java.lang.Cloneable接口的原理
 * 如何实现"实现接口就允许做xxx,否则就抛出异常"这种需求呢?
 * 需要使用instanceof关键字
 * 通过instanceof关键字来判断是否实现了这个接口,以进行不同的操作
 *
 * 在Java代码的底层是采取类似的原理进行判断的
 *
 * 像Cloneable接口这样的,自身是空的,实现它不会引入任何新的成员
 * 起着标记作用的接口: 实现它允许做xxx,不实现不允许做xxx
 * 称之为"标记接口"
 *
 *
 * @since 17:23
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        judge(new A());
        judge(new B());
    }

    // 写一个方法判断: 实现接口IA就允许做克隆操作,否则就抛出异常
    public static void judge(Object o) {
        if (o instanceof IA) {
            // o对象的类型实现了接口
            System.out.println("允许做克隆操作!");
        } else {
            // o对象的类型没有实现接口
            System.out.println("抛出异常,禁止克隆!");
        }
    }
}

class A {}
class B implements IA{}
interface IA {
}
